perm filename PUZZ.SAI[226,JMC] blob sn#005390 filedate 1972-05-30 generic text, type T, neo UTF8
00100	BEGIN 	"PUZZLE"
00200		REQUIRE 50000 SYSTEM_PDL;
00300		INTEGER ARRAY S[1:43,1:43],G[1:43,1:43],MM[1:43,1:43],
00400		SM[1:43,1:43],MG[1:43,1:43],SG[1:43,1:43];
00500	INTEGER M,N;
00600	PRELOAD_WITH 4,2,1,2,3,1,5,2,3,3,2,2,3,5,3,2,3,2,3,2,2,3,5,1,2,
00700	3,5,1,3,2,1,3,2,3,3,2,3,1,5,3,2,1,2;
00800	INTEGER ARRAY Q[1:43];
00900	
01000	FORWARD RECURSIVE INTEGER PROCEDURE CSENT1(INTEGER M,N,P);
01100	FORWARD RECURSIVE INTEGER PROCEDURE CSENTMOAN(INTEGER M,N);
01200	FORWARD RECURSIVE INTEGER PROCEDURE CSENTMOAN1(INTEGER M,N,P);
01300	FORWARD RECURSIVE INTEGER PROCEDURE CMOAN(INTEGER M,N);
01400	FORWARD RECURSIVE INTEGER PROCEDURE CMOAN1(INTEGER M,N,P);
01500	FORWARD RECURSIVE INTEGER PROCEDURE CMOANGROAN(INTEGER M,N);
01600	FORWARD RECURSIVE INTEGER PROCEDURE CMOANGROAN1(INTEGER M,N,P);
01700	FORWARD RECURSIVE INTEGER PROCEDURE CGROAN1(INTEGER M,N,P);
01800	FORWARD RECURSIVE INTEGER PROCEDURE CGROAN(INTEGER M,N);
01900	FORWARD RECURSIVE INTEGER PROCEDURE CSENTGROAN(INTEGER M,N);
02000	FORWARD RECURSIVE INTEGER PROCEDURE CSENTGROAN1(INTEGER M,N,P);
02100	
02200	RECURSIVE INTEGER PROCEDURE CSENT(INTEGER M,N);
02300	BEGIN
02400	RETURN(IF M>N THEN 1 ELSE IF S[M,N]=-1 THEN (S[M,N]←CSENT1(M,N,M)) ELSE S[M,N]) END;
02500	
02600	RECURSIVE INTEGER PROCEDURE CSENT1(INTEGER M,N,P);
02700	BEGIN
02800	RETURN(IF P>N THEN (IF M>N THEN 1 ELSE 0)
02900	ELSE IF Q[P]= 1 THEN CMOAN(M,P-1)*CGROAN(P+1,N)+CSENT1(M,N,P+1)
03000	ELSE IF Q[P]= 5 THEN CGROAN(M,P-1)*CSENTMOAN(P+1,N)+CSENT1(M,N,P+1)
03100	ELSE CSENT1(M,N,P+1)) END;
03200	
03300	RECURSIVE INTEGER PROCEDURE CSENTMOAN(INTEGER M,N);
03400	BEGIN
03500	RETURN(IF M>N THEN 1 ELSE IF SM[M,N]=-1 THEN 
03600		(SM[M,N] ← CSENTMOAN1(M,N,M)) ELSE SM[M,N]) END;
03700	
03800	RECURSIVE INTEGER PROCEDURE CSENTMOAN1(INTEGER M,N,P);
03900	BEGIN
04000	RETURN(IF P>N THEN CMOAN(M,N) 
04100		ELSE CSENT(M,P-1)*CMOAN(P,N)+CSENTMOAN1(M,N,P+1)) END;
04200	
04300	RECURSIVE INTEGER PROCEDURE CMOAN(INTEGER M,N);
04400	BEGIN
04500	RETURN(IF M>N THEN 1 ELSE IF MM[M,N]=-1 THEN
04600		(MM[M,N] ← CMOAN1(M,N,M)) ELSE MM[M,N]) END;
04700	
04800	RECURSIVE INTEGER PROCEDURE CMOAN1(INTEGER M,N,P);
04900	BEGIN
05000	RETURN(IF P>N THEN (IF M>N THEN 1 ELSE 0)
05100	ELSE IF Q[P]=2 THEN CSENT(M,P-1)*CSENT(P+1,N)+CMOAN1(M,N,P+1)
05200	ELSE IF Q[P]=3 THEN CGROAN(M,P-1)*CMOANGROAN(P+1,N)+CMOAN1(M,N,P+1)
05300	ELSE CMOAN1(M,N,P+1)) END;
05400	
05500	RECURSIVE INTEGER PROCEDURE CMOANGROAN(INTEGER M,N);
05600	BEGIN 
05700	RETURN(IF M>N THEN 1 ELSE IF MG[M,N]=-1 THEN
05800		(MG[M,N]←CMOANGROAN1(M,N,M)) ELSE MG[M,N]) END;
05900	
06000	RECURSIVE INTEGER PROCEDURE CMOANGROAN1(INTEGER M,N,P);
06100	BEGIN
06200	RETURN(IF P>N THEN 1 ELSE CMOAN(M,P-1)*CGROAN(P,N)+CMOANGROAN1(M,N,P+1))
06300	END;
06400	
06500	RECURSIVE INTEGER PROCEDURE CGROAN(INTEGER M,N);
06600	BEGIN
06700	RETURN(IF M>N THEN 1 ELSE IF G[M,N]=-1 THEN
06800		(G[M,N] ← CGROAN1(M,N,M)) ELSE G[M,N]) END;
06900	
07000	RECURSIVE INTEGER PROCEDURE CGROAN1(INTEGER M,N,P);
07100	BEGIN
07200	RETURN(IF P>N THEN (IF M>N THEN 1 ELSE 0)
07300		ELSE IF Q[P]=3 THEN CMOAN(M,P-1)*CGROAN(P,N)+CGROAN1(M,N,P+1)
07400		ELSE IF Q[P]=4 THEN CGROAN(M,P-1)*CSENTGROAN(P,N)
07500			+CGROAN1(M,N,P+1)
07600		ELSE CGROAN1(M,N,P+1)) END;
07700	
07800	RECURSIVE INTEGER PROCEDURE CSENTGROAN(INTEGER M,N);
07900	BEGIN
08000	RETURN(IF M>N THEN 1 ELSE IF SG[M,N]=-1 THEN
08100		(SG[M,N] ← CSENTGROAN1(M,N,M)) ELSE SG[M,N]) END;
08200	
08300	RECURSIVE INTEGER PROCEDURE CSENTGROAN1(INTEGER M,N,P);
08400	BEGIN
08500	RETURN(IF P>N THEN 1 ELSE CSENT(M,P-1)*CGROAN(P,N)+
08600			CSENTGROAN1(M,N,P+1)) END;
08700	
08800	FOR M←1 STEP 1 UNTIL 43 DO
08900	FOR N←1 STEP 1 UNTIL 43 DO
09000	BEGIN S[M,N]←MM[M,N]←G[M,N]←SM[M,N]←MG[M,N]←SG[M,N]←-1 END;
09100	
09200	OUTSTR(CVS(CSENT(1,43)))
09300	END;